package controller;


import java.util.ArrayList;

import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import view.VisualizarCliente;

import Utils.StringUtil;
import Utils.ValidaDados;

import model.ClienteDAO;
import model.EmpresaDAO;
import model.bean.ClienteBean;
import model.bean.EmpresaBean;

public class ClienteController {
	
	public static boolean cadastrarCliente(String nome, String cpf, String email, String telefone, String nomeEmpresa, String cnpj, boolean hasEmpresa){
		boolean hasError = hasError(nome, cpf, email, telefone);
		if(hasError){
			String msg = msgErro(nome, cpf, email, telefone);
			JOptionPane.showMessageDialog(null, msg);
			return false;
		}
		if(!ValidaDados.CPF(cpf)){
			JOptionPane.showMessageDialog(null, "Numero de CPF inválido");
			return false;
		}
		ClienteBean cliente = ClienteDAO.getClientePorCpf(cpf);
		if(cliente == null){
			cliente = new ClienteBean(nome, cpf, email, telefone);
			ClienteDAO.insertCliente(cliente);
		}
		if(hasEmpresa){
			if(!EmpresaController.cadastrarEmpresa(nomeEmpresa, cnpj)){
				return false;
			}
			EmpresaBean empresa = EmpresaDAO.getEmpresaByCnpj(cnpj);
			if((cliente.getEmpresa() != null) && cliente.getEmpresa().getIdEmpresa() != empresa.getIdEmpresa()){
				int idCliente = cliente.getIdCliente();
				int idEmpresa = empresa.getIdEmpresa();
				ClienteDAO.updateEmpresa(idEmpresa, idCliente);
			}
		}
		return true;
	}
	public static ClienteBean getClientePorCpf(String cpf){
		return ClienteDAO.getClientePorCpf(cpf);
	}
	public static ClienteBean getClientePorId(int id){
		return ClienteDAO.getClientePorId(id);
	}
	
	public static void pesquisar(String nome, String cpf, String email, JTable tabela){

		ArrayList<Object> tabelaCliente = ClienteDAO.pesquisarCliente(nome,cpf,email);

		if(!tabelaCliente.isEmpty()){
			Object[] columnNames = {"Código", "Nome", "CPF", "Email", "Telefone", "Empresa"};
			DefaultTableModel model = (DefaultTableModel) tabela.getModel();
			model.setColumnCount(((Object[])tabelaCliente.get(0)).length);
			model.setRowCount(0);
			model.setColumnIdentifiers(columnNames);
			for(Object clients: tabelaCliente ){
				model.addRow((Object[])clients);
			}
			tabela.setModel(model);
			tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	        tabela.getColumnModel().getColumn(0).setPreferredWidth(60);
	        tabela.getColumnModel().getColumn(1).setPreferredWidth(197);
	        tabela.getColumnModel().getColumn(2).setPreferredWidth(104);
	        tabela.getColumnModel().getColumn(3).setPreferredWidth(190);
	        tabela.getColumnModel().getColumn(4).setPreferredWidth(107);
	        tabela.getColumnModel().getColumn(5).setPreferredWidth(209);
		}else{
			JOptionPane.showMessageDialog(null, "Nenhum dado encontrado!");
		}
	}
	public static boolean localizar(JTextField txtNomeCliente, JTextField txtCpfCliente, JTextField txtEmailCliente, 
			JFormattedTextField ftxtTelefoneCliente, JTextField txtNomeEmpresa, JTextField txtCNPJEmpresa){
		if(txtCpfCliente.getText().trim().isEmpty()){
			JOptionPane.showMessageDialog(null, "Para localizar um cliente, digite o CPF");
			return false;
		}
		ClienteBean cliente = getClientePorCpf(txtCpfCliente.getText());
		if(cliente == null){
			JOptionPane.showMessageDialog(null, "Cliente não encontrado");
			return false;
		}
		txtNomeCliente.setText(cliente.getNome());
		txtCpfCliente.setText(cliente.getCpf());
		txtEmailCliente.setText(cliente.getEmail());
		ftxtTelefoneCliente.setText(cliente.getTelefone());
		if(cliente.getEmpresa() != null){
			txtNomeEmpresa.setText(cliente.getEmpresa().getRazaoSocial());
			txtCNPJEmpresa.setText(cliente.getEmpresa().getCnpj());
			txtNomeEmpresa.setEditable(false);
			txtCNPJEmpresa.setEditable(false);
		}
		txtNomeCliente.setEditable(false);
		txtCpfCliente.setEditable(false);
		txtEmailCliente.setEditable(false);
		ftxtTelefoneCliente.setEditable(false);
		return true;
	}
	public static void habilitaCampos(JTextField txtNomeCliente, JTextField txtCpfCliente, JTextField txtEmailCliente, 
			JFormattedTextField ftxtTelefoneCliente, JTextField txtNomeEmpresa, JTextField txtCNPJEmpresa){
		limpaCampos(txtNomeCliente, txtCpfCliente, txtEmailCliente, ftxtTelefoneCliente, txtNomeEmpresa, txtCNPJEmpresa);
		
		txtNomeEmpresa.setEditable(true);
		txtCNPJEmpresa.setEditable(true);

		txtNomeCliente.setEditable(true);
		txtCpfCliente.setEditable(true);
		txtEmailCliente.setEditable(true);
		ftxtTelefoneCliente.setEditable(true);
	}
	public static void limpaCampos(JTextField txtNomeCliente, JTextField txtCpfCliente, JTextField txtEmailCliente, 
			JFormattedTextField ftxtTelefoneCliente, JTextField txtNomeEmpresa, JTextField txtCNPJEmpresa){
		txtNomeCliente.setText("");
		txtCpfCliente.setText("");
		txtEmailCliente.setText("");
		ftxtTelefoneCliente.setText("");
		if(!txtNomeEmpresa.getText().isEmpty()) txtNomeEmpresa.setText("");
		if(!txtCNPJEmpresa.getText().isEmpty()) txtCNPJEmpresa.setText("");
	}
	public static boolean hasError(String nome, String cpf, String email, String telefone){
		if(nome.trim().isEmpty() || cpf.trim().isEmpty() || email.trim().isEmpty() || StringUtil.limpaTelefone(telefone).trim().isEmpty()){
			return true;
		}
		return false;
	}
	public static String msgErro(String nome, String cpf, String email, String telefone){
		String msg = "Dado(s) de cliente obrigatório(s):";
		if(nome.trim().isEmpty()) {
			msg += "\nNome do cliente";
		}
		if(cpf.trim().isEmpty()){
			msg += "\nCpf";
		}
		if(email.trim().isEmpty()){
			msg += "\nEmail";
		}
		System.out.println(telefone);
		if(StringUtil.limpaTelefone(telefone).trim().isEmpty()){
			msg += "\nTelefone";
		}
		return msg;
	}
	public static void montaTelaAlterar(int idCliente, JTable tabela){
		
		ClienteBean cliente = getClientePorId(idCliente);
		VisualizarCliente tela = new VisualizarCliente(null, true, tabela);
		tela.txtCodigo.setText(""+cliente.getIdCliente());
		tela.txtNome.setText(cliente.getNome());
		tela.txtCpf.setText(cliente.getCpf());
		tela.txtEmail.setText(cliente.getEmail());
		tela.ftxtTelefone.setText(StringUtil.limpaTelefone(cliente.getTelefone()));
		if(cliente.getEmpresa() != null){
			tela.txtNomeEmpresa.setText(cliente.getEmpresa().getRazaoSocial());
			tela.txtCnpj.setText(cliente.getEmpresa().getCnpj());
		}
		tela.setVisible(true);
	}
	public static void editaCliente(String id, String nome, String cpf, String telefone, String email, String cnpj, String nomeEmpresa){
		boolean hasEmpresa = true;
		if(nomeEmpresa.isEmpty() && cnpj.isEmpty()){
			hasEmpresa = false;
		}
		boolean hasError = hasError(nome, cpf, email, telefone);
		if(hasError){
			String msg = msgErro(nome, cpf, email, telefone);
			JOptionPane.showMessageDialog(null, msg);
			return;
		}
		if(!ValidaDados.CPF(cpf)){
			JOptionPane.showMessageDialog(null, "CPF inválido");
			return;
		}
		EmpresaBean empresa = null;
		if(hasEmpresa){
			if(!EmpresaController.cadastrarEmpresa(nomeEmpresa, cnpj)){
				return;
			}
			empresa = EmpresaController.getEmpresaPorCNPJ(cnpj);	
		}
		
		ClienteBean cliente = getClientePorId(Integer.parseInt(id));
		cliente.setIdCliente(Integer.parseInt(id));
		cliente.setNome(nome);
		cliente.setCpf(cpf);
		cliente.setEmail(email);
		cliente.setTelefone(telefone);
		cliente.setEmpresa(empresa);
		
		if(ClienteDAO.updateCliente(cliente)){
			JOptionPane.showMessageDialog(null, "Cliente alterado com sucesso!");
		}else{
			JOptionPane.showMessageDialog(null, "Ocorreu um erro ao alterar o cliente, tente novamente.");
		}
	}
	public static void janelaFechou(JTable tabela){
		pesquisar("", "", "", tabela);
	}
	public static void limpaTela(JTextField nome, JTextField cpf, JTextField email){
		nome.setText("");
		cpf.setText("");
		email.setText("");
	}
}
